ホームに戻る
関連 :
基本的なDLLの作成手順
目次 :

DLLのエントリポイント

一般的なWin32 DLLは DllMain() をエントリポイントに持つ。
(Win32アプリケーション(EXE)のエントリポイントは WinMain() 。)
DllMain() の一般形(スケルトン)は以下の通り。
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: // DLLがプロセスのアドレス空間にマッピングされた (LoadLibrary) break; case DLL_THREAD_ATTACH: // スレッドが作成されようとしている break; case DLL_THREAD_DETACH: // スレッドが破棄されようとしている break; case DLL_PROCESS_DETACH: // DLLのマッピングが解除されようとしている (FreeLibrary) break; } return TRUE; }
DLLを(動的に)リンクした場合、DllMain() は以下のタイミングでコールされる。

DLL内の静的オブジェクトの生成タイミング

DLL内に静的オブジェクトが存在する場合、 DLLロード時 DllMain() のコールより前に生成され、DLLアンロード時 DllMain() のコール後に破棄される
以下のコードを参照。
テスト用EXE
int _tmain(int argc, _TCHAR* argv[]) { wprintf(L"Main , entered\n"); // DLLロード wprintf(L"Main , loading library\n"); HMODULE h = LoadLibrary(L"Test.dll"); if (h) { // DLLアンロード wprintf(L"Main , freeing library\n"); FreeLibrary(h); } wprintf(L"Main , exiting\n"); return 0; }
DLL
// 構造体 Moo 型 struct Moo { Moo() { wprintf(L"Moo , constructor\n"); } //< コンストラクタ ~Moo() { wprintf(L"Moo , destructor\n"); } //< デストラクタ }; Moo m; //< 静的な Moo インスタンス // DllMain() 関数 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: wprintf(L"DllMain, DLL_PROCESS_ATTACH\n"); break; case DLL_THREAD_ATTACH: wprintf(L"DllMain, DLL_THREAD_ATTACH\n"); break; case DLL_THREAD_DETACH: wprintf(L"DllMain, DLL_THREAD_DETACH\n"); break; case DLL_PROCESS_DETACH: wprintf(L"DllMain, DLL_PROCESS_DETACH\n"); break; default: wprintf(L"DllMain, ????\n"); break; } return TRUE; }
出力結果 (解説のために改行、コメントを追加)
Main , entered Main , loading library //< EXEからDLLをロード Moo , constructor //< 静的 Moo インスタンス生成 DllMain, DLL_PROCESS_ATTACH //< DllMain() : dwReason = DLL_PROCESS_ATTACH Main , freeing library //< EXEからDLLをアンロード DllMain, DLL_PROCESS_DETACH //< DllMain() : dwReason = DLL_PROCESS_DETACH Moo , destructor //< 静的 Moo インスタンス破棄 Main , exiting